package cn.actoncode.boot.framework.common.exception.enums;

import cn.actoncode.boot.framework.common.exception.ErrorCode;

/**
 * 全局错误码枚举
 * 0-999 系统异常编码保留
 *
 * 一般情况下，使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
 * 虽然说，HTTP 响应状态码作为业务使用表达能力偏弱，但是使用在系统层面还是非常不错的
 * 比较特殊的是，因为之前一直使用 0 作为成功，就不使用 200 啦。
 *
 * @author bin
 */
public interface GlobalErrorCodeConstants {

    ErrorCode SUCCESS = new ErrorCode(200, "成功");

    // ========== 客户端错误段 ==========

    ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确");
    ErrorCode UNAUTHORIZED = new ErrorCode(401, "用户认证失败，请重新登录");
    ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限");
    ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到");
    ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确");
    ErrorCode READ_TIMEOUT = new ErrorCode(408, "请求超时");
    ErrorCode LOCKED = new ErrorCode(423, "请求失败，请稍后重试"); // 并发请求，不允许
    ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁，请稍后重试");
    ErrorCode LIMIT_REQUEST_ERROR = new ErrorCode(499, "请求过于频繁，当前已有{}个请求正在处理，请稍后重试");

    // ========== 服务端错误段 ==========

    ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常");
    ErrorCode NOT_IMPLEMENTED = new ErrorCode(501, "功能未实现/未开启");
    ErrorCode SQL_ERROR = new ErrorCode(598, "系统异常");
    ErrorCode SQL_DUPLICATE_ENTRY_ERROR = new ErrorCode(599, "系统异常");

    // ========== redis错误段 ==========

    ErrorCode REDIS_READ_TIMEOUT = new ErrorCode(608, "请求超时key[{}]");
    ErrorCode REDIS_GET_LOCK_ERROR = new ErrorCode(609, "redis锁获取失败");

    // ========== wechat错误段 ==========

    ErrorCode SEC_CHECK_MESSAGE_ERROR = new ErrorCode(660, "提交失败，{}");
    ErrorCode WX_APPID_ERR = new ErrorCode(661, "传入appid错误，未找到对应appid={}的配置，请核实！");
    ErrorCode WX_KF_MSG_ERROR = new ErrorCode(662, "发送客服消息失败");

    // ========== 文本语音错误段 ==========

    ErrorCode TEXT_DUB_ERROR = new ErrorCode(700, "文本转语音失败！");

    ErrorCode SPEECH_RECOGNIZE_ERROR = new ErrorCode(701, "语音识别失败，{}");

    // ========== 对象存储错误段 ==========

    ErrorCode OSS_TEMP_ACCESS_TOKEN_ERROR = new ErrorCode(720, "获取临时访问token失败");

    // ========== NLP错误段 ==========
    ErrorCode NLP_ERROR = new ErrorCode(751, "操作失败，{}");
    ErrorCode NLP_SEC_CHECK_ERROR = new ErrorCode(752, "系统检测到输入或生成内容可能包含不安全或敏感内容，请您避免输入易产生敏感内容的提示语，感谢您的配合");
    ErrorCode NLP_QPS_ERROR = new ErrorCode(753, "操作失败，当前服务器繁忙，请稍后再试");
    ErrorCode NLP_MAX_LENGTH_ERROR = new ErrorCode(754, "操作失败，已达到最大长度");

    // ========== SOCKET错误段 ==========
    ErrorCode SK_NOT_EXIST_ERROR = new ErrorCode(761, "连接失败，sk不存在");
    ErrorCode SOCKET_CLOSE_ERROR = new ErrorCode(762, "操作失败，当前没有建立连接");
    ErrorCode SOCKET_CONNECT_ERROR = new ErrorCode(763, "操作失败，当前用户没有建立连接");

    // ========== 智谱AI错误段 ==========

    ErrorCode ZHIPU_AI_TOKEN_ERROR = new ErrorCode(770, "操作失败，获取鉴权token失败");
    ErrorCode ZHIPU_AI_CHAT_ERROR = new ErrorCode(771, "当前功能使用人数过多，请稍后再试");
    ErrorCode ZHIPU_AI_QPS_ERROR = new ErrorCode(773, "操作失败，当前服务器繁忙，请稍后再试");

    // ========== MiniMax AI错误段 ==========

    ErrorCode MINI_MAX_AI_TOKEN_ERROR = new ErrorCode(770, "操作失败，获取鉴权token失败");
    ErrorCode MINI_MAX_AI_CHAT_ERROR = new ErrorCode(771, "当前功能使用人数过多，请稍后再试");
    ErrorCode MINI_MAX_AI_QPS_ERROR = new ErrorCode(773, "操作失败，当前服务器繁忙，请稍后再试");

    // ========== 阿里ims错误段 ==========

    ErrorCode IMS_ERROR = new ErrorCode(800, "操作失败，请稍后重试");
    ErrorCode IMS_ASR_ERROR = new ErrorCode(801, "字幕获取失败，请稍后重试");
    ErrorCode IMS_MEDIA_PRODUCING_JOB_ERROR = new ErrorCode(802, "操作失败，请稍后重试");
    ErrorCode IMS_PLACEHOLDER_ERROR = new ErrorCode(803, "操作失败，{}");

    // ========== 阿里云错误段 ==========

    ErrorCode ALIYUN_OCR_ERROR = new ErrorCode(1100, "操作失败，请稍后重试");

    // ========== 自定义错误段 ==========
    ErrorCode REPEATED_REQUESTS = new ErrorCode(9000, "重复请求，请稍后重试"); // 重复请求
    ErrorCode DEMO_DENY = new ErrorCode(9001, "演示模式，禁止写操作");
    ErrorCode SERVICED = new ErrorCode(9998, "服务器维护中");
    ErrorCode UNKNOWN = new ErrorCode(9999, "未知错误");
    ErrorCode CUSTOMIZE_ERROR = new ErrorCode(10000, "{}");

    /**
     * 是否为服务端错误，参考 HTTP 5XX 错误码段
     *
     * @param code 错误码
     * @return 是否
     */
   static boolean isServerErrorCode(Integer code) {
       return code != null
               && code >= INTERNAL_SERVER_ERROR.getCode() && code <= INTERNAL_SERVER_ERROR.getCode() + 99;
   }

}
